Être capable de faire une étude associative sur un nombre d’éléments fini permet de savoir extraire des informations sur les éléments à rapprocher ou à séparer quel que soit le domaine. Une étude associative son mon clavier, par exemple, pourrait extraire les lettres les plus utilisées et donc mènerait à une solution pour générer un layout de clavier maximisant ma vitesse d’écriture, comme par exemple le clavier Dvorak.
Nous disposons de plusieurs jeux de données concernant le contenu de chariots. L’intérêt est de savoir quels produits sont généralement trouvés ensemble afin d’être capables de mieux cibler nos clients, en mettant des offres groupant les produits qui se trouvent ensemble ou de les mettre côte à côte dans les rayons. Le tout ayant pour objectif de maximiser l’achat et donc le profit.
library(arules)
## Warning: package 'arules' was built under R version 3.4.3
## Loading required package: Matrix
##
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
##
## abbreviate, write
library(TSP)
## Warning: package 'TSP' was built under R version 3.4.3
library(arulesViz)
## Warning: package 'arulesViz' was built under R version 3.4.3
## Loading required package: grid
library(DT)
## Warning: package 'DT' was built under R version 3.4.3
df_groceries_3_1 <- read.table("analyse_chariots_3_1.csv", header=T,fill=T, encoding="utf-8", sep=";", dec=".",quote = "", na.string="" )
df_groceries_3_1[1:10,1:10]
## Hair_Conditioner Lemons Standard_coffee Frozen_Chicken_Wings
## 1 0 0 0 0
## 2 0 0 0 0
## 3 0 0 0 0
## 4 0 0 0 0
## 5 0 0 0 0
## 6 0 0 0 0
## 7 0 0 0 0
## 8 0 0 0 0
## 9 0 0 0 0
## 10 0 0 0 0
## X98pct_Fat_Free_Hamburger Sugar_Cookies Onions Deli_Ham
## 1 0 0 0 0
## 2 0 0 0 0
## 3 0 0 0 0
## 4 0 0 0 0
## 5 0 0 0 0
## 6 0 0 0 0
## 7 0 0 0 0
## 8 1 0 0 0
## 9 0 0 0 0
## 10 0 0 0 0
## Dishwasher_Detergent Beets
## 1 0 0
## 2 0 0
## 3 0 0
## 4 0 0
## 5 0 0
## 6 0 0
## 7 0 0
## 8 0 0
## 9 0 0
## 10 0 0
Pour passer à un authentique format transactionnel (qu’on pourra utiliser dans nos algorithmes), on doit transformer toutes nos colonnes en “logical”, c’est à dire une succession de vrai ou de faux
for(b in colnames(df_groceries_3_1)) df_groceries_3_1[[b]] <- as.logical(df_groceries_3_1[[b]])
trans <- as(df_groceries_3_1, "transactions")
trans
## transactions in sparse format with
## 1361 transactions (rows) and
## 303 items (columns)
On va essayer deux algorithmes différents, eclat et apriori.
Nos études nous ont montré que:
ECLAT représente une amélioration par rapport à apriori dans l’extraction de groupes d’objets fréquents, puisque l’algorithme apriori a besoin de scanner la base plusieurs fois pour calculer le support, mais pas ECLAT.
ECLAT n’extrait pas de règles, contrairement à apriori. Il extrait plutôt les groupes d’objets fréquents. Cela bien sûr peut être utilisé par ruleInduction pour extraire les règles.
Apriori fonctionne plus rapidement qu’ECLAT dans des datasets avec beaucoup de transactions mais peu de types d’objets, alors qu’ECLAT fonctionne mieux avec des datasets au nombre de transactions limité, mais avec plus d’objets.
basket_rules<-apriori(trans,parameter=list(sup=0.03,conf=0.6,target="rules"))
basket_eclat <- eclat(trans, parameter = list(support = 0.03, tidLists = TRUE))
basket_rules_eclat <- ruleInduction(basket_eclat, trans, confidence = 0.6)
Les règles extraites sont bidirectionnelles. On va retirer les règles redondantes.
Pour apriori
sub.matrix=is.subset(basket_rules,basket_rules,sparse = FALSE)
sub.matrix[lower.tri(sub.matrix,diag = TRUE)] <- NA
redundant=colSums(sub.matrix,na.rm = TRUE)>=1
NewRules<-basket_rules[!redundant]
inspect(head(sort(NewRules, by ="lift"),10))
## lhs rhs support confidence lift count
## [1] {Hot_Dog_Buns} => {Hot_Dogs} 0.04188097 0.7125000 7.696131 57
## [2] {Hamburger_Buns} => {X98pct_Fat_Free_Hamburger} 0.04849375 0.6804124 7.291663 66
## [3] {Hot_Dog_Buns} => {Sweet_Relish} 0.03600294 0.6125000 7.186315 49
## [4] {Eggs,
## Wheat_Bread} => {White_Bread} 0.03012491 0.7454545 6.262738 41
## [5] {Beer_And_Potato_Juice,
## Cola} => {White_Bread} 0.03012491 0.7454545 6.262738 41
## [6] {Eggs,
## Cola} => {White_Bread} 0.03012491 0.7454545 6.262738 41
## [7] {Beer_And_Potato_Juice,
## Wheat_Bread} => {White_Bread} 0.03159442 0.7413793 6.228501 43
## [8] {Potato_Chips,
## Beer_And_Potato_Juice} => {White_Bread} 0.03306392 0.7377049 6.197632 45
## [9] {Potato_Chips,
## Beer_And_Potato_Juice} => {Eggs} 0.03379868 0.7540984 6.145676 46
## [10] {X98pct_Fat_Free_Hamburger,
## Potato_Chips} => {White_Bread} 0.03085966 0.7118644 5.980540 42
et pour ECLAT
sub.matrix=is.subset(basket_rules_eclat,basket_rules_eclat,sparse = FALSE)
sub.matrix[lower.tri(sub.matrix,diag = TRUE)] <- NA
redundant_eclat=colSums(sub.matrix,na.rm = TRUE)>=1
NewRules_eclat<-basket_rules_eclat[!redundant_eclat]
inspect(head(sort(NewRules_eclat, by ="lift"),10))
## lhs rhs support confidence lift itemset
## [1] {Hot_Dog_Buns,
## Sweet_Relish} => {Hot_Dogs} 0.03012491 0.8367347 9.038063 13
## [2] {Hot_Dog_Buns} => {Hot_Dogs} 0.04188097 0.7125000 7.696131 14
## [3] {Hamburger_Buns} => {X98pct_Fat_Free_Hamburger} 0.04849375 0.6804124 7.291663 5
## [4] {Hot_Dog_Buns} => {Sweet_Relish} 0.03600294 0.6125000 7.186315 15
## [5] {Eggs,
## Wheat_Bread} => {Beer_And_Potato_Juice} 0.03085966 0.7636364 6.975229 83
## [6] {White_Bread,
## Cola} => {Beer_And_Potato_Juice} 0.03012491 0.7454545 6.809152 95
## [7] {White_Bread,
## Wheat_Bread} => {Beer_And_Potato_Juice} 0.03159442 0.7288136 6.657149 82
## [8] {Beer_And_Potato_Juice,
## Eggs} => {Potato_Chips} 0.03379868 0.6478873 6.629885 149
## [9] {Beer_And_Potato_Juice,
## White_Bread} => {Potato_Chips} 0.03306392 0.6428571 6.578410 148
## [10] {White_Bread,
## Toothpaste} => {Potato_Chips} 0.03012491 0.6307692 6.454714 140
inspectDT(NewRules_eclat)
plotly_arules(NewRules_eclat)
Associations extraites d’ECLAT
Hot_Dog_Buns,Sweet_Relish,Hot_Dogs: Lorsqu’on achète des hot dogs, on achète aussi le pain des hot dogs. Lorsqu’on achète du painde hot dogs, on achète aussi des cornichons sucrés
Hot_Dog_Buns,Hot_Dogs: Lorsqu’on achète des hot dogs, on achète aussi le pain des hot dogs.
Hamburger_Buns, Fat_Free_Hamburger: Lorsqu’on achète du pain de hamburger, on achète aussi du hamburger sans graisse.
Hot_Dog_Buns,Sweet_Relish: Lorsqu’on achète du painde hot dogs, on achète aussi des cornichons sucrés
Eggs,Wheat_Bread,Beer_And_Potato_Juice: Le pain de blé et les oeufs indiquent un comportement de personne vivant seule et cuisinant vite. Cela est renforcé par la présence du bundle “Bière et jus de patate”
White_Bread,Cola,Beer_And_Potato_Juice: Le bundle “Bière et jus de patate” est très prisé avec le coca et le pain de mie. C’est explicable quand on sait qu’on peut faire des apéritifs avec le pain de mie, et que quand on achète des boissons alcoolisées pour soit, il faut bien prendre une boisson pour la famille.
White_Bread,Wheat_Bread,Beer_And_Potato_Juice: Le bundle “Bière et jus de patate” est très prisé avec le pain de mie pour les raisons expliquées ci dessus. Le pain de mie est lui même associé au pain de blé parce que le pain est généralement dans le même rayon.
Beer_And_Potato_Juice,Eggs,Potato_Chips: Là, ça rejoint tant l’esprit “soirée entre amis” que l’esprit “repas du célibataire”
White_Bread,Toothpaste,Potato_Chips: Règle intéressante: Ceux qui mangent des chips ont peur pour leur haleine.
inspectDT(NewRules)
plotly_arules(NewRules)
Associations extraites d’APRIORI
Hot_Dog_Buns et Hot_Dogs: Lorsqu’on achète des hot dogs, on achète aussi le pain des hot dogs.
Hamburger_Buns et Fat_Free_Hamburger: Lorsqu’on achète du pain de hamburger, on achète aussi du hamburger sans graisse.
Hot_Dog_Buns Sweet_Relish: Lorsqu’on achète du painde hot dogs, on achète aussi des cornichons sucrés
Eggs, Wheat_Bread, White_Bread: Lorsqu’on achète du pain de blé, on achète aussi du pain de mie et des oeufs. Rien d’étonnant pour le pain de blé et le pain de mie car le pain est généralement dans un seul rayon.
Beer_And_Potato_Juice, Cola, White_Bread: Le bundle “Bière et jus de patate” est très prisé avec le coca et le pain de mie. C’est explicable quand on sait qu’on peut faire des apéritifs avec le pain de mie, et que quand on achète des boissons alcoolisées pour soit, il faut bien prendre une boisson pour la famille.
Eggs, Cola, White_Bread: Des oeufs, du pain et du soda. Ou le repas du célibataire
Beer_And_Potato_Juice,Wheat_Bread White_Bread: Le bundle “Bière et jus de patate” est très prisé avec le pain de mie pour les raisons expliquées ci dessus. Le pain de mie est lui même associé au pain de blé pour les raisons associées ci dessus.
Potato_Chips,Beer_And_Potato_Juice White_Bread: Les chips, le bundle “Bière et jus de patate” et le pain de mie. Encore une fois, l’esprit de l’apéritif pour les chips et le pain de mie.
Potato_Chips, Beer_And_Potato_Juice, Eggs: Là, ça rejoint tant l’esprit “soirée entre amis” que l’esprit “repas du célibataire”
Fat_Free_Hamburger,Potato_Chips White_Bread: Hamburger, Chips et pain de mie. Autre version populaire du repas du célibataire.
L’étude a montré des associations claires entre le pain et la bière, mais aussi entre le pain et les oeufs, la bière et le coca, et surtout les chips et les brosses à dent.
En mettant ces produits dans des rayons adjacent, on pourrait encourager l’achat et donc augmenter les ventes.